/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Juegos;

import Estados.Estado;
import Estados.ePuzzle;
import java.util.Random;

/**
 *
 * @author Alvaro
 */
public class NPuzzle extends Juego{


    public NPuzzle(Estado e){
        super(e,4);
        ePuzzle ep=(ePuzzle) e;
        for (int i=0;i<ep.getTam()*10;i++){
            int x=(int)(Math.random()*4);
            e=operar(x,e);
            if(e==null) e=this.eInicial;
            else this.eInicial=e;
        }
        e.setCoste(0);
        
    }

    public Estado operar(int x, Estado in) {
        ePuzzle nuevo=null;
        ePuzzle e=(ePuzzle) in;
        switch(x){
            case 0:{
                    nuevo=arriba(e);
                    if(nuevo!=null) nuevo.setCoste(2);
                    break;}
            case 1:{
                nuevo=abajo(e);
                if(nuevo!=null) nuevo.setCoste(2);
                break;
            }
            case 2:{
                nuevo=izquierda(e);
                if(nuevo!=null) nuevo.setCoste(1);
                break;
            }
            case 3:{
                nuevo=derecha(e);
                if(nuevo!=null) nuevo.setCoste(1);
                break;
            }
        }
        return nuevo;
    }

        private ePuzzle arriba(ePuzzle e){
            ePuzzle nuevo = new ePuzzle(e);
            int x,y;
            x=e.getLibreX();
            y=e.getLibreY();
            int tam=e.getTam();
            if(y>0){
                nuevo.getSituacion()[x][y]=nuevo.getSituacion()[x][y-1];
                nuevo.getSituacion()[x][y-1]=0;
                nuevo.setCoste(0);
                nuevo.setLibreX(x);
                nuevo.setLibreY(y-1);
                return nuevo;
            }
            return null;
        }

        private ePuzzle abajo(ePuzzle e){
            ePuzzle nuevo = new ePuzzle(e);
            int x,y;
            x=e.getLibreX();
            y=e.getLibreY();
            int tam=e.getTam();
            if(y<tam-1){
                nuevo.getSituacion()[x][y]=nuevo.getSituacion()[x][y+1];
                nuevo.getSituacion()[x][y+1]=0;
                nuevo.setCoste(0);
                nuevo.setLibreX(x);
                nuevo.setLibreY(y+1);
                return nuevo;
            }
            return null;
        }

        private ePuzzle derecha(ePuzzle e){
            ePuzzle nuevo = new ePuzzle(e);
            int x,y;
            x=e.getLibreX();
            y=e.getLibreY();
            int tam=e.getTam();
            if(x<tam-1){
                nuevo.getSituacion()[x][y]=nuevo.getSituacion()[x+1][y];
                nuevo.getSituacion()[x+1][y]=0;
                nuevo.setCoste(0);
                nuevo.setLibreX(x+1);
                nuevo.setLibreY(y);
                return nuevo;
            }
            return null;
        }

        private ePuzzle izquierda(ePuzzle e){
            ePuzzle nuevo = new ePuzzle(e);
            int x,y;
            x=e.getLibreX();
            y=e.getLibreY();
            int tam=e.getTam();
            if(x>0){
                nuevo.getSituacion()[x][y]=nuevo.getSituacion()[x-1][y];
                nuevo.getSituacion()[x-1][y]=0;
                nuevo.setCoste(0);
                nuevo.setLibreX(x-1);
                nuevo.setLibreY(y);
                return nuevo;
            }
            return null;
        }

    public boolean esInicial(Estado e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public boolean esFinal(Estado e) {
        ePuzzle ep=(ePuzzle) e;
        int[][] situacion=ep.getSituacion();
        int[][] solucion=ep.getSolucion();
        for (int i=0;i<ep.getTam();i++)
            for (int j=0;j<ep.getTam();j++){
                if(situacion[i][j]!=solucion[i][j]){
                    return false;
                }
            }
        return true;
    }


    public boolean esPeligro(Estado e) {
        return false;
    }

}
